// == 导包-开始 ==
import Koa from 'koa'
import Router from 'koa-router'
import bodyParser from 'koa-bodyparser'
import cors from '@koa/cors'
import { Sequelize, DataTypes, Op } from 'sequelize'
import bcrypt from 'bcrypt'

// == 导包-结束 == 

// == 实例化-开始 ==
var app = new Koa()
var router = new Router()
var port = 5000
// == 实例化-结束 ==
// == 连接数据库并创建数据库实例-开始 ==
var sequelize = new Sequelize('volunteer', 'root', 'Ye725601', {
    host: '8.152.214.221',
    dialect: "mysql"
})
// == 志愿者活动表-开始 ==
var Vol = sequelize.define('activity', {
    // 活动标题
    title: {
        type: DataTypes.STRING
    },
    // 活动时间
    vtime: {
        type: DataTypes.STRING
    },
    // 活动地点
    place: {
        type: DataTypes.STRING
    },
    // 活动状态
    vstatus: {
        type: DataTypes.STRING
    },
    // 活动内容
    content: {
        type: DataTypes.STRING
    },
    // 活动来源
    source: {
        type: DataTypes.STRING
    },
    // 服务时长
    servertime: {
        type: DataTypes.INTEGER
    },
    // 招募人数
    people: {
        type: DataTypes.INTEGER
    },
    // 报名状态 审核中,已报名 -2  审核通过 -1  审核拒绝 -0 
    statue: {
        type: DataTypes.INTEGER
    },
}, {
    timestamps: false
})
// == 志愿者活动表-结束 ==
// == 积分表-开始 ==
var Point = sequelize.define('point', {
    // 服务次数
    number: {
        type: DataTypes.INTEGER
    },
    // 服务时长
    servertime: {
        type: DataTypes.INTEGER
    },
    // 总的服务积分
    point: {
        type: DataTypes.INTEGER
    },
    // 积分获取时间
    pointtime: {
        type: DataTypes.DATE
    },
    name: {
        type: DataTypes.STRING
    }
}, { timestamps: false })
// == 积分表-结束 ==
// == 个人信息表-开始 ==
let User = sequelize.define('user', {
    name: {
        type: DataTypes.STRING
    },
    uId: {
        type: DataTypes.INTEGER
    },
    phone: {
        type: DataTypes.STRING
    },
    school: {
        type: DataTypes.STRING
    },
    sex: {
        type: DataTypes.INTEGER
    },
    major: {
        type: DataTypes.STRING
    },
    attribute: {
        type: DataTypes.STRING
    }
}, {
    timestamps: false
})
// == 个人信息表-结束 ==
// == 个人信息管理表-开始 ==
let Admin = sequelize.define('administrators', {
    uname: {
        type: DataTypes.STRING
    },
    account: {
        type: DataTypes.STRING
    },
    password: {
        type: DataTypes.STRING
    }
}, {
    timestamps: false
})
// == 个人信息管理表-结束 ==

// == 所有用户完成的志愿活动表-开始 ==
let UserVol = sequelize.define('allfinshact', {
    parent: {
        type: DataTypes.STRING
    }, servertime: {
        type: DataTypes.DATE
    }, serverlong: {
        type: DataTypes.INTEGER
    }, servercontent: {
        type: DataTypes.STRING
    }, name: {
        type: DataTypes.STRING
    }
}, { timestamps: false })
// == 所有用户完成的志愿活动表-结束 ==

// await sequelize.sync({ force: true })
// == 连接数据库并创建数据库实例-结束 ==

// == 跨域和请求体获取-开始 ==
app.use(bodyParser())
app.use(cors())

// == 跨域和请求体获取-结束 ==

// == 志愿者活动路由配置-开始 ==
router.get('/volunteers', async (ctx) => {
    ctx.body = await Vol.findAll()
})

router.get('/volunteer/:id', async (ctx) => {
    let vId = parseInt(ctx.params.id)
    ctx.body = await Vol.findByPk(vId)
})

router.get('/volunteer', async (ctx) => {
    let key = ctx.request.query.keyword.trim()
    ctx.body = await Vol.findAll({
        where: {
            [Op.or]: {
                title: {
                    [Op.like]: `%${key}%`
                },
                place: {
                    [Op.like]: `%${key}%`
                }
            }
        }
    })
})

router.post('/volunteer', async (ctx) => {
    ctx.body = ''
    let obj = ctx.request.body
    await Vol.create(obj)
})

router.put('/volunteer/:id', async (ctx) => {
    ctx.body = ''
    let vId = parseInt(ctx.params.id)
    let obj = ctx.request.body
    await Vol.update(obj, {
        where: {
            id: vId
        }
    })
})

router.delete('/volunteer/:id', async (ctx) => {
    ctx.body = ''
    let vId = parseInt(ctx.params.id)
    await Vol.delete({
        where: {
            id: vId
        }
    })
})
// == 志愿者活动路由配置-结束 ==

// == 服务时长路由配置-开始 ==
router.get('/point', async (ctx) => {
    // 根据积分多少进行排序 使用 order参数
    ctx.body = await Point.findAll({
        order: [['point', 'desc']]
    })
})

router.get('/point/:time', async (ctx) => {
    ctx.body = ''
})

router.post('/point', async (ctx) => {
    ctx.body = ''
})
router.put('/point/:id', async (ctx) => {
    ctx.body = ''
})
router.delete('/point/:id', async (ctx) => {
    ctx.body = ''
})
// == 服务时长路由配置-结束 ==

// == 个人信息路由配置-开始 ==
// 获取用户信息
router.get('/user/:name', async (ctx) => {
    let uName = ctx.params.name
    ctx.body = await User.findAll({
        where: {
            name: uName
        }
    })
})
// 修改用户信息
router.put('/user/:uId', async (ctx) => {
    let uId = parseInt(ctx.params.uId)
    let obj = ctx.request.body
    ctx.body = ''
    await User.update(obj, {
        where: {
            uId
        }
    })
})
// == 个人信息路由配置-结束 ==

// == 个人账户路由配置-开始 ==
router.get('/admin/:account', async (ctx) => {
    let uAccount = ctx.params.account
    ctx.body = await Admin.findAll({
        where: {
            account: uAccount
        }
    })


})

router.get('/admins', async (ctx) => {

    const uAccount = ctx.request.query.account;
    const uPassword = ctx.request.query.password;

    // 先查找用户
    const adminUser = await Admin.findOne({
        where: {
            account: uAccount
        }
    })
    /**
     * 先判断用户是否存在
     * 如果存在再判断密码是否一样
     */
    if (!adminUser) {
        return ctx.status = 401 // 未授权
    } else {
        let dataPassword = adminUser.dataValues.password // 获取当前用户在数据库中存储的密码
        if (uPassword === dataPassword) {
            return ctx.status = 200 // 如果用户输入的密码和数据库中的一样状态返回200
        }
    }
})
// 用于注册时用户名是否存在
router.get('/admin/:account', async (ctx) => {
    ctx.body = ''
    let account = ctx.params.account
    console.log(account);

    let tmpObj = await Admin.findOne({
        where: {
            account
        }
    })
    console.log(tmpObj);

    if (tmpObj) {
        return ctx.status = 404
    } else {
        return ctx.status = 200
    }
})

router.post('/admin', async (ctx) => {
    ctx.body = ''
    let tmpObj = ctx.request.body
    await Admin.create(tmpObj)
})
// 数据库和个人信息同步
router.get('/admins/:uaccount', async (ctx) => {
    let uAccount = ctx.params.uaccount
    ctx.body = await Admin.findAll({
        where: {
            account: uAccount
        }
    })

})
// == 个人账户路由配置-结束 ==

// == 志愿者查询自己服务记录路由配置-开始 ==
router.post('/uservol', async (ctx) => {
    ctx.body = ''
    let tmpObj = ctx.request.body
    await UserVol.create(tmpObj)
})

// == 志愿者查询自己服务记录路由配置-结束 ==

// == 相关配置-开始 ==
app.use(router.routes())
app.listen(port, () => {
    console.log(`Server is running http://localhost:${port}`);
})
// == 相关配置-结束 ==